#ifndef STATE_H
#define STATE_H

#include "setBehavior.h"
#include "Steering.h"
#include "Obstacle.h"

class State {
  protected:
    Uint32 old_time;
  public:
    setBehavior *b;
    virtual State *procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*> bs,int max_life)=0;
    virtual State *processYells(Kinematic *player,setBehavior *b);
    virtual State *processPlayer();
    Steering* getSteering();
    void Atacar(Uint32 old_time,Kinematic *myK);
};

class WaitingP : public State{ 
  public:
    WaitingP(setBehavior *b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
  State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class Run : public State{
  public:
    Run(setBehavior *b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
  State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class AttackP : public State{
  public:
    AttackP(setBehavior *b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
  State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class SeekP : public State{
  public:
    SeekP(setBehavior *b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
  State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class Heal : public State{
  public:
    Heal(setBehavior *b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class SeekPNow: public State{
  public:
    SeekPNow(setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class Go : public State{
  public:
    Go(Kinematic *point,setBehavior* b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class WaitingPE: public State{
  public:
    WaitingPE(setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class AttackPE: public State{
  public:
    AttackPE(setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class GoPE: public State{
  public:
    GoPE(Kinematic *point,setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class RunPE: public State{
  public:
    RunPE(setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};

class FNave:public State{
  public:
    FNave(setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
    State* processPlayer(setBehavior *b);
};


/*
class NaveNothing:public State{
  public:
    NaveNothing(setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};
class NaveArrive:public State{
  public:
    NaveArrive(setBehavior *_b);
    State* procces(int life, Kinematic *myK,Kinematic *player,bool enemyCerca, vector<setBehavior*>bs,int max_life);
    State* processYells( Kinematic *player,setBehavior *b);
    State* processPlayer();
};
*/

#endif
